// 通过rollup进行打包
// 1. 引入相关模块（路径）

import ts from 'rollup-plugin-typescript2'; // 解析ts
import json from '@rollup/plugin-json';
import resolvePlugin from '@rollup/plugin-node-resolve';
import path from 'path';
import { createRequire } from 'module'
import { fileURLToPath } from 'url'
//__dirname是commonjs规范的内置变量。如果使用了esm，是不会注入这个变量的。
//
// 在commonjs中，注入了__dirname，__filename, module, exports, require五个内置变量用于实现导入导出的能力。而在esm中，因为规范已经完全不一样，故实现方式也是不一样的。
//
// 在esm中，显然模块的导入导出使用export/import，自然不会再用exports /require，同理__dirname，__filename也有对应的规范写法。

if (!process.env.TARGET) {
    throw new Error('TARGET package must be specified via --environment flag.')
}

const require = createRequire(import.meta.url)
const __dirname = fileURLToPath(new URL('.', import.meta.url))

// 2.获取文件路径
let packagesDir = path.resolve(__dirname, 'packages');

// 2.1 获取打包以后的包
let packageDir = path.resolve(packagesDir, process.env.target);
let resolve = p => path.resolve(packageDir, p);
const pkg = require(resolve('package.json'));
const buildOptions = pkg.buildOptions || {};
const name = path.basename(packageDir);
const outOptions = {
    "esm-bundler": {
        file: resolve(`dist/${name}.esm-bundler.js`),
        format: 'es'
    },
    "cjs": {
        file: resolve(`dist/${name}.cjs.js`),
        format: 'cjs'
    },
    "global": {
        file: resolve(`dist/${name}.global.js`),
        format: 'iife'
    }
}
function createConfig (format, output) {
    // 进行打包
    output.name = buildOptions.name;
    output.sourcemap = true;
    // 生成rollup 配置
    return {
        input: resolve('src/index.ts'), // 导入
        output,
        plugins: [
            json(),
            ts({ // 解析ts语法
                tsconfig: path.resolve(__dirname, 'tsconfig.json')
            }),
            resolvePlugin() // 解析第三方插件
        ]
    }
}

// rollup 需要导出一个配置
export default buildOptions.formats.map(format => createConfig(format, outOptions[format]));;
